/*
 * Licensed to the 南京汇海交通科技有限公司
 *
 * Copyright (c) 2025.
 * All rights reserved.
 *
 * 本软件属南京汇海交通科技有限公司所有，在未获得南京汇海交通科技有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.chframework.boot.core.client;

import com.chframework.common.constant.SystemConstant;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpCookie;
import org.springframework.lang.Nullable;

import java.time.Duration;
import java.util.Objects;

/**
 * 存放于客户端浏览器中的cookie对象
 */
@Getter
@Setter
public class BrowserCookie extends HttpCookie {
    /**
     * cookie的持续时长(单位：秒)
     */
    private int cookieMaxAge;
    /**
     * 设置Cookie所属域名
     */
    @Nullable
    private String domain;
    /**
     * 设置Cookie(在某个域名下)的存放路径
     */
    @Nullable
    private String path;
    /**
     * 设置Cookie是否为安全的
     */
    private boolean secure;
    /**
     * 防止客户端脚本通过document.cookie属性访问Cookie，保护Cookie不被跨站脚本攻击窃取或篡改。
     */
    private boolean httpOnly;

    /**
     * 防止 CSRF 攻击 和用户追踪（第三方恶意获取cookie），限制第三方 Cookie
     */
    private String sameSite;

    public BrowserCookie(String cookieName, String cookieValue, Duration cookieMaxAge) {
        super(cookieName, cookieValue);
        this.cookieMaxAge = (int) cookieMaxAge.getSeconds();
        if (StringUtils.EMPTY.equals(this.getValue())) {
            this.cookieMaxAge = 0;
        }
        this.domain = StringUtils.EMPTY;
        this.path = SystemConstant.FOLDER_SEPARATOR;
        this.secure = Boolean.FALSE;
        this.httpOnly = true;
        this.sameSite = SameSite.LAX.getValue();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        BrowserCookie that = (BrowserCookie) o;
        if (StringUtils.isBlank(getName()) || StringUtils.isBlank(that.getName())) {
            return false;
        }
        return Objects.equals(getName(), that.getName());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getName());
    }
}
